package com.zdxlz.fcmp.common.security.util;

import com.zdxlz.fcmp.common.security.service.SystemUserLoginDetail;
import com.zdxlz.fcmp.upms.api.entity.SystemUser;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import java.util.List;

/**
 * @Description：
 * @Author： aman
 * @Date： 2025/2/25 13:57
 */
public class UserLoginInfoUtil {

    /**
     * @description：获取当前用户登陆账号
     * @author：aman
     * @date：2025/2/25 13:59
     */
    public static String getUserLoginAccount() {
        // 获取 SecurityContextHolder 中的认证对象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 检查 authentication 是否为有效用户
        if (authentication != null && authentication.isAuthenticated() && !(authentication instanceof AnonymousAuthenticationToken)) {
            // 确保 authentication 不是匿名用户之后再进行类型转换
            if (authentication instanceof UsernamePasswordAuthenticationToken authenticationToken) {
                SystemUserLoginDetail sysUser = (SystemUserLoginDetail) authenticationToken.getPrincipal();
                return sysUser.getMobile();
            }
        }
        return null;
    }

    /**
     * @description：获取当前用户信息
     * @author：aman
     * @date：2025/2/25 13:59
     */
    public static SystemUser getUserInfo() {
        // 获取 SecurityContextHolder 中的认证对象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 检查 authentication 是否为有效用户
        if (authentication != null && authentication.isAuthenticated() && !(authentication instanceof AnonymousAuthenticationToken)) {
            // 确保 authentication 不是匿名用户之后再进行类型转换
            if (authentication instanceof UsernamePasswordAuthenticationToken authenticationToken) {
                SystemUserLoginDetail userLoginDetail = (SystemUserLoginDetail) authenticationToken.getPrincipal();
                return userLoginDetail.getSystemUser();
            }
        }
        return null;
    }

    /**
     * @description：获取当前用户登陆用户菜单权限
     * @author：aman
     * @date：2025/2/25 13:59
     */
    public static List<String> getUserLoginPermissions() {
        // 获取 SecurityContextHolder 中的认证对象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 检查 authentication 是否为有效用户
        if (authentication != null && authentication.isAuthenticated() && !(authentication instanceof AnonymousAuthenticationToken)) {
            // 确保 authentication 不是匿名用户之后再进行类型转换
            if (authentication instanceof UsernamePasswordAuthenticationToken authenticationToken) {
                SystemUserLoginDetail userLoginDetail = (SystemUserLoginDetail) authenticationToken.getPrincipal();
                return userLoginDetail.getPermissions();
            }
        }
        return null;
    }

    /**
     * @description：获取当前用户登陆用户角色信息
     * @author：aman
     * @date：2025/2/25 13:59
     */
    public static List<String> getUserLoginRoles() {
        // 获取 SecurityContextHolder 中的认证对象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 检查 authentication 是否为有效用户
        if (authentication != null && authentication.isAuthenticated() && !(authentication instanceof AnonymousAuthenticationToken)) {
            // 确保 authentication 不是匿名用户之后再进行类型转换
            if (authentication instanceof UsernamePasswordAuthenticationToken authenticationToken) {
                SystemUserLoginDetail userLoginDetail = (SystemUserLoginDetail) authenticationToken.getPrincipal();
                return userLoginDetail.getRoles();
            }
        }
        return null;
    }

    /**
     * @description：获取当前用户登陆信息（包括用户信息、用户菜单权限信息、用户角色信息）
     * @author：aman
     * @date：2025/2/25 13:59
     */
    public static SystemUserLoginDetail getUserLoginDetail() {
        // 获取 SecurityContextHolder 中的认证对象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 检查 authentication 是否为有效用户
        if (authentication != null && authentication.isAuthenticated() && !(authentication instanceof AnonymousAuthenticationToken)) {
            // 确保 authentication 不是匿名用户之后再进行类型转换
            if (authentication instanceof UsernamePasswordAuthenticationToken authenticationToken) {
                return (SystemUserLoginDetail) authenticationToken.getPrincipal();
            }
        }
        return null;
    }
}
